package com.danciyixue.boot.dcyx.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.danciyixue.boot.dcyx.model.entity.UserStudyRecords;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.danciyixue.boot.dcyx.model.entity.UserStudyRecords;
import com.danciyixue.boot.dcyx.model.query.UserStudyRecordsQuery;
import com.danciyixue.boot.dcyx.model.vo.UserStudyRecordsVO;
import com.danciyixue.boot.dcyx.model.vo.WordsVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 用户学习记录Mapper接口
 *
 * @author youlaitech
 * @since 2025-06-15 17:26
 */
@Mapper
public interface UserStudyRecordsMapper extends BaseMapper<UserStudyRecords> {

    /**
     * 获取用户学习记录分页数据
     *
     * @param page 分页对象
     * @param queryParams 查询参数
     * @return {@link Page<UserStudyRecordsVO>} 用户学习记录分页列表
     */
    Page<UserStudyRecordsVO> getUserStudyRecordsPage(Page<UserStudyRecordsVO> page, UserStudyRecordsQuery queryParams);

    /**
     * 统计用户今日学习单词数量
     *
     * @param userId 用户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 学习单词数量
     */
    Integer countTodayStudyWords(@Param("userId") Long userId, @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);

    /**
     * 根据用户ID、单词ID、来源和来源字段查找学习记录
     *
     * @param userId 用户ID
     * @param wordId 单词ID
     * @param source 来源
     * @param sourceFrom 来源字段
     * @return 用户学习记录
     */
    UserStudyRecords findByUserIdAndWordIdAndSourceAndSourceFrom(@Param("userId") Long userId,
                                                                 @Param("wordId") Long wordId,
                                                                 @Param("source") String source,
                                                                 @Param("sourceFrom") String sourceFrom);

    /**
     * 获取用户需要复习的单词列表
     *
     * @param userId 用户ID
     * @param programId 教材ID
     * @param unitIds 单元ID列表，如果为空则查询所有单元
     * @param source 来源
     * @return 需要复习的单词列表
     */
    List<WordsVO> getReviewWords(@Param("userId") Long userId,
                                 @Param("programId") Long programId,
                                 @Param("unitIds") List<Long> unitIds,
                                 @Param("source") String source);
}

